package leetcode_500;

/**
 *@author 周杨
 *SmallestGoodBase_483 首先完成字符串到数字的转换，然后对于特定的num，
 *当前的最长的其他进制的表示长度是进制为2时的表示长度，就是log2(num)+1（注意：10..0有t个0，那么10..0=2^t）。
 *那么指数i的遍历区间就是[1，log2(num)+1]。对于当前数的当前指数i，可能的base整数取值是num^(1/(i-1))。
 *describe:AC 47%
 *@see:https://www.cnblogs.com/Deribs4/p/7216625.html
 *2018年9月2日 下午6:11:06
 */
public class SmallestGoodBase_483 {
	public String smallestGoodBase(String n) {
        long num = Long.parseLong(n);
        int maxIndex = (int) (Math.log(num)/Math.log(2) + 1);
        for(int i = maxIndex; i >= 3; i--) {
            long base = (long)Math.pow(num, 1.0 / (i - 1)), sum = 1, cur = 1;
            for(int j = 1; j < i; j++) {
                sum += (cur *= base);
            }
            if(sum == num) return String.valueOf(base);
            // java中没有无符号数，而且Math.pow(base, i) - 1存在精度问题，例如样例"14919921443713777"，结果应该为"496"，但是下列语句的结果是"14919921443713776"
            // if((long)((Math.pow(base, i) - 1) / (base - 1)) == num) return String.valueOf(base);
        }
        return String.valueOf(num - 1);
    }
}
